package com.info.zhiduoduo.admin.schedule;

import com.google.common.util.concurrent.ThreadFactoryBuilder;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {

	@Override
	public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
		scheduledTaskRegistrar.setScheduler(buildSchedulerThreadPool());
	}

	@Bean("scheduleThreadPool")
	public ScheduledExecutorService buildSchedulerThreadPool() {
		ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("scheduled-%d").build();

		/**
		 * 1. CallerRunsPolicy ：    这个策略重试添加当前的任务，他会自动重复调用 execute() 方法，直到成功。
		 2. AbortPolicy ：         对拒绝任务抛弃处理，并且抛出异常。
		 3. DiscardPolicy ：       对拒绝任务直接无声抛弃，没有异常信息。
		 4. DiscardOldestPolicy ： 对拒绝任务不抛弃，而是抛弃队列里面等待最久的一个线程，然后把拒绝任务加到队列。
		 不写则为默认的AbortPolicy策略。
		 */
		return new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), threadFactory,
				new ThreadPoolExecutor.CallerRunsPolicy());
	}
}
